/*
实验2-3 线性表元素的区间删除
分数 20
作者 陈越
单位 浙江大学

给定一个顺序存储的线性表，请设计一个时间和空间上尽可能高效的算法删除所有值位于区间
(min, max) 内的元素。 函数接口定义：

List Delete( List list, ElemSet min_value, ElemSet max_value );

其中顺序表 List 的结构定义如下：

typedef int Position; /* 整型下标，表示元素的位置
typedef struct ListNode *List;
struct ListNode {
    ElemSet data[kMaxSize]; /* 存储数据的数组
    Position last; /* 线性表中最后一个元素在数组中的位置
};

函数接口定义中，ElemSet 是用户定义的数据类型，例如 int、double 或者 char
等，要求可以通过 >、==、< 进行比较；min_value 和 max_value
分别为待删除元素的值域的下、上界。函数 Delete 应将 data[] 中所有值大于 min_value
而且小于 max_value
的元素删除，同时保证表中剩余元素保持顺序存储，并且相对位置不变，最后返回删除后的表。

输入样例：

9
4 -8 2 12 1 5 9 3 3 10
0 4

输出样例：

4 -8 12 5 9 10
*/

#include <stdio.h>
#include <stdlib.h>

#define kMaxSize 20
typedef int ElemSet;
typedef int Position; /* 整型下标，表示元素的位置 */
typedef struct ListNode *List;
struct ListNode {
    ElemSet data[kMaxSize]; /* 存储数据的数组 */
    Position last;          /* 线性表中最后一个元素在数组中的位置 */
};

List Delete(List list, ElemSet min_value, ElemSet max_value);

int main(void) {
    List list;
    ElemSet min_value, max_value;
    int i;

    list = (List)malloc(sizeof(struct ListNode));
    scanf("%d", &list->last);
    for (i = 0; i <= list->last; i++) {
        scanf("%d", &list->data[i]);
    }
    scanf("%d %d", &min_value, &max_value);
    list = Delete(list, min_value, max_value);
    for (i = 0; i <= list->last; i++) {
        printf("%d ", list->data[i]);
    }
    printf("\n");

    return 0;
}
/* 你的代码将被嵌在这里 */

List Delete(List list, ElemSet min_value, ElemSet max_value) {
    int i, j;
    for (i = 0, j = 0; i <= list->last; i++) {
        if (list->data[i] <= min_value || list->data[i] >= max_value) {
            list->data[j++] = list->data[i];
        }
    }
    list->last = j - 1;
    return list;
}